home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Linux Cubed Series 7: Sunsite
/
Linux Cubed Series 7 - Sunsite Vol 1.iso
/
system
/
linux-bo
/
rampatch.z
/
rampatch
Wrap
Text File
|
1993-09-30
|
17KB
|
629 lines
diff -rc2 ./Makefile /usr/src/linux/Makefile
*** ./Makefile Thu Aug 5 11:59:18 1993
--- /usr/src/linux/Makefile Thu Sep 30 10:44:29 1993
***************
*** 163,166 ****
--- 163,169 ----
sync
+ zNetBoot: $(CONFIGURE) boot/bootsect boot/setup zBoot/zSystem tools/build
+ tools/build -n tools/zSystem \? boot/bootsect boot/setup zBoot/zSystem > zNetBoot
+
zdisk: zImage
dd bs=8192 if=zImage of=/dev/fd0
diff -rc2 ./boot/bootsect.S /usr/src/linux/boot/bootsect.S
*** ./boot/bootsect.S Tue Apr 6 20:57:20 1993
--- /usr/src/linux/boot/bootsect.S Thu Sep 9 07:41:23 1993
***************
*** 46,49 ****
--- 46,52 ----
#define RAMDISK 0
#endif
+ #ifndef RAMDISK_START
+ #define RAMDISK_START 0 /* for net boot 1024, for zBoot + net boot -> after &end */
+ #endif
#ifndef CONFIG_ROOT_RDONLY
#define CONFIG_ROOT_RDONLY 0
***************
*** 433,437 ****
.ascii "Loading"
! .org 498
root_flags:
.word CONFIG_ROOT_RDONLY
--- 436,442 ----
.ascii "Loading"
! .org 496
! ramdsk_start:
! .word RAMDISK_START
root_flags:
.word CONFIG_ROOT_RDONLY
diff -rc2 ./boot/setup.S /usr/src/linux/boot/setup.S
*** ./boot/setup.S Thu May 13 12:19:57 1993
--- /usr/src/linux/boot/setup.S Thu Sep 30 10:10:27 1993
***************
*** 49,52 ****
--- 49,60 ----
mov ds,ax
+ mov dx,#0x4000-12 ! 0x4000 is arbitrary value >= length of
+
+ ! we've done all this before in bootsect, but not if we netbooted!
+
+ mov es,ax
+ mov ss,ax ! put stack at INITSEG:0x4000-12.
+ mov sp,dx
+
! Get memory size (extended mem, kB)
diff -rc2 ./init/main.c /usr/src/linux/init/main.c
*** ./init/main.c Mon Aug 9 18:02:31 1993
--- /usr/src/linux/init/main.c Thu Sep 9 08:16:18 1993
***************
*** 95,98 ****
--- 95,99 ----
#define DRIVE_INFO (*(struct drive_info_struct *) (PARAM+0x80))
#define SCREEN_INFO (*(struct screen_info *) (PARAM+0))
+ #define RAMDISK_START (*(unsigned short *)(PARAM+0x1F0))
#define MOUNT_ROOT_RDONLY (*(unsigned short *) (PARAM+0x1F2))
#define RAMDISK_SIZE (*(unsigned short *) (PARAM+0x1F8))
***************
*** 166,169 ****
--- 167,171 ----
unsigned char aux_device_present;
int ramdisk_size;
+ int ramdisk_start; /* if set, then assumed that ramdisk already loaded */
int root_mountflags = 0;
***************
*** 344,347 ****
--- 346,350 ----
memory_end &= PAGE_MASK;
ramdisk_size = RAMDISK_SIZE;
+ ramdisk_start = RAMDISK_START;
strcpy(command_line,COMMAND_LINE);
#ifdef CONFIG_MAX_16M
***************
*** 351,360 ****
if (MOUNT_ROOT_RDONLY)
root_mountflags |= MS_RDONLY;
! if ((unsigned long)&end >= (1024*1024)) {
! memory_start = (unsigned long) &end;
! low_memory_start = PAGE_SIZE;
! } else {
! memory_start = 1024*1024;
! low_memory_start = (unsigned long) &end;
}
low_memory_start = PAGE_ALIGN(low_memory_start);
--- 354,378 ----
if (MOUNT_ROOT_RDONLY)
root_mountflags |= MS_RDONLY;
!
! if (ramdisk_start) {
! if ((unsigned long)&end >= (1024*1024)) {
! /* using zBoot */
! if (ramdisk_start * 1024 < ((unsigned long)&end)) {
! printk("Ramdisk at incompatible location with kernel\n");
! /* what should I do here ? */
! }
! low_memory_start = PAGE_SIZE;
! } else {
! low_memory_start = (unsigned long) &end;
! }
! memory_start = ramdisk_start * 1024 + ramdisk_size * 1024;
! } else {
! if ((unsigned long)&end >= (1024*1024)) {
! memory_start = (unsigned long) &end;
! low_memory_start = PAGE_SIZE;
! } else {
! memory_start = 1024*1024;
! low_memory_start = (unsigned long) &end;
! }
}
low_memory_start = PAGE_ALIGN(low_memory_start);
diff -rc2 ./kernel/blk_drv/blk.h /usr/src/linux/kernel/blk_drv/blk.h
*** ./kernel/blk_drv/blk.h Sat Aug 14 23:47:22 1993
--- /usr/src/linux/kernel/blk_drv/blk.h Thu Sep 9 07:41:23 1993
***************
*** 86,91 ****
extern void rd_load(void);
! extern long rd_init(long mem_start, int length);
extern int ramdisk_size;
extern unsigned long xd_init(unsigned long mem_start, unsigned long mem_end);
--- 86,92 ----
extern void rd_load(void);
! extern long rd_init(long mem_start, int length, int preload);
extern int ramdisk_size;
+ extern int ramdisk_start;
extern unsigned long xd_init(unsigned long mem_start, unsigned long mem_end);
diff -rc2 ./kernel/blk_drv/ll_rw_blk.c /usr/src/linux/kernel/blk_drv/ll_rw_blk.c
*** ./kernel/blk_drv/ll_rw_blk.c Sat Aug 14 23:47:22 1993
--- /usr/src/linux/kernel/blk_drv/ll_rw_blk.c Thu Sep 9 07:41:24 1993
***************
*** 438,443 ****
mem_start = mcd_init(mem_start,mem_end);
#endif
! if (ramdisk_size)
! mem_start += rd_init(mem_start, ramdisk_size*1024);
return mem_start;
}
--- 438,447 ----
mem_start = mcd_init(mem_start,mem_end);
#endif
! if (ramdisk_size) {
! if (ramdisk_start)
! rd_init(ramdisk_start*1024, ramdisk_size*1024, 1);
! else
! mem_start += rd_init(mem_start, ramdisk_size*1024, 0);
! }
return mem_start;
}
diff -rc2 ./kernel/blk_drv/ramdisk.c /usr/src/linux/kernel/blk_drv/ramdisk.c
*** ./kernel/blk_drv/ramdisk.c Wed Aug 4 22:38:40 1993
--- /usr/src/linux/kernel/blk_drv/ramdisk.c Thu Sep 9 07:56:20 1993
***************
*** 28,31 ****
--- 28,33 ----
char *rd_start;
int rd_length = 0;
+ int rd_isloaded = 0;
+
static int rd_blocksizes[2] = {0, 0};
***************
*** 74,78 ****
* Returns amount of memory which needs to be reserved.
*/
! long rd_init(long mem_start, int length)
{
int i;
--- 76,80 ----
* Returns amount of memory which needs to be reserved.
*/
! long rd_init(long mem_start, int length, int preload)
{
int i;
***************
*** 88,92 ****
cp = rd_start;
for (i=0; i < length; i++)
! *cp++ = '\0';
for(i=0;i<2;i++) rd_blocksizes[i] = 1024;
--- 90,98 ----
cp = rd_start;
for (i=0; i < length; i++)
! rd_isloaded = preload;
! if (!preload) {
! for (i=0; i < length; i++)
! *cp++ = '\0';
! }
for(i=0;i<2;i++) rd_blocksizes[i] = 1024;
***************
*** 115,118 ****
--- 121,129 ----
rd_length, (int) rd_start);
+ if (rd_isloaded) {
+ if (ROOT_DEV != ((MAJOR_RAMDISK << 8) | MINOR_RAMDISK))
+ printk("Root device not set to ramdisk\n");
+ return;
+ }
/* If we are doing a diskette boot, we might have to pre-load it. */
if (MAJOR(ROOT_DEV) != MAJOR_FLOPPY) return;
***************
*** 177,178 ****
--- 188,190 ----
}
}
+
diff -rc2 ./tools/build.c /usr/src/linux/tools/build.c
*** ./tools/build.c Sun May 30 13:53:36 1993
--- /usr/src/linux/tools/build.c Thu Sep 30 10:27:30 1993
***************
*** 19,22 ****
--- 19,23 ----
/*
* Changes by tytso to allow root device specification
+ * 25 Sep 1993 jwh - changes for network boot stuff
*/
***************
*** 32,35 ****
--- 33,39 ----
#include <linux/a.out.h>
+ #define MAJOR_RAMDISK 1 /* should be in <linux/major.h> */
+ #define MINOR_RAMDISK 1
+
#define MINIX_HEADER 32
#define GCC_HEADER 1024
***************
*** 37,40 ****
--- 41,52 ----
#define SYS_SIZE DEF_SYSSIZE
+ #define DEF_RAMSTART 0x100000
+
+ #define SYS_SIZE DEF_SYSSIZE
+ #define INITSEG DEF_INITSEG
+ #define SYSSEG DEF_SYSSEG
+ #define SETUPSEG DEF_SETUPSEG
+ #define RAMPTR DEF_RAMSTART
+
#define DEFAULT_MAJOR_ROOT 0
#define DEFAULT_MINOR_ROOT 0
***************
*** 46,49 ****
--- 58,96 ----
#define STRINGIFY(x) #x
+ typedef struct load_record
+ {
+ unsigned long rlength;
+ unsigned long address;
+ unsigned long ilength;
+ unsigned long mlength;
+ } LOAD_RECORD;
+
+ #define FLAG_EOF 0x04000000
+
+ typedef struct load_header
+ {
+ unsigned long magic;
+ unsigned long hlengthflags;
+ unsigned long locn;
+ unsigned long execute;
+ LOAD_RECORD lr_setup;
+ LOAD_RECORD lr_kernel;
+ LOAD_RECORD lr_ramdisk;
+ char dummy[496 - 64]; /* bring us up to 496 */
+ unsigned short ramdsk_start; /* start of ramdisk / 1024 */
+ unsigned short root_flags;
+ unsigned short syssize; /* SYSSIZE / 16 */
+ unsigned short swap_dev; /* SWAP_DEV */
+ unsigned short ram_size; /* RAMDISK in K */
+ unsigned short vid_mode; /* SVGA_MODE */
+ unsigned char root_dev_minor; /* ROOT_DEV */
+ unsigned char root_dev_major; /* ROOT_DEV */
+ unsigned short boot_flag; /* 0xAA55 */
+ } LOAD_HEADER;
+
+ #define LENGTH_FIELD 4
+
+ LOAD_HEADER lh;
+
typedef union {
long l;
***************
*** 72,75 ****
--- 119,130 ----
}
+ short unintel_short(short l)
+ {
+ conv t;
+
+ t.s[0] = l;
+ return (t.b[0] + (t.b[1] << 8));
+ }
+
void die(char * str)
{
***************
*** 80,84 ****
void usage(void)
{
! die("Usage: build bootsect setup system [rootdev] [> image]");
}
--- 135,139 ----
void usage(void)
{
! die("Usage: build [-n uncompressed-image ramdisk] bootsect setup system [rootdev] [>image]");
}
***************
*** 92,99 ****
struct stat sb;
! if ((argc < 4) || (argc > 5))
! usage();
! if (argc > 4) {
! if (!strcmp(argv[4], "CURRENT")) {
if (stat("/", &sb)) {
perror("/");
--- 147,232 ----
struct stat sb;
! unsigned long ramsize;
! unsigned long ramstart;
! unsigned long iramsize;
! unsigned long total_length;
! unsigned long fluffed_length;
!
! int is_netBoot;
! char *argp;
! int argn;
! char *unc_image_name;/* name of uncompressed image file */
! char *ram_name; /* name or ramdisk file */
! char *bootsect_name;
! char *setup_name;
! char *zImage_name;
! char *root_dev_name;
! char name_of_ramdisk[128];
!
!
! if (sizeof(LOAD_HEADER) != 512)
! die("Bad build, load header size");
! unc_image_name =
! ram_name =
! bootsect_name =
! setup_name =
! zImage_name =
! root_dev_name = (char *)NULL;
!
! is_netBoot = 0;
! for(argn = 1; argn < argc; argn++) {
! argp = argv[argn];
! if (*argp != '-') {
! if (is_netBoot) {
! if (unc_image_name == NULL) {
! unc_image_name = argp;
! continue;
! }
! else
! if (ram_name == NULL){
! if (*argp == '?') {
! fprintf(stderr, "Name of ramdisk :");
! fgets(name_of_ramdisk, sizeof(name_of_ramdisk),stdin);
! if ((argp = strchr(name_of_ramdisk, '\n')) != NULL)
! *argp = '\0';
! if (name_of_ramdisk[0] == '\0')
! usage();
! argp = name_of_ramdisk;
! }
! ram_name = argp;
! continue;
! }
! }
! if (bootsect_name == NULL)
! bootsect_name = argp;
! else if (setup_name == NULL)
! setup_name = argp;
! else if (zImage_name == NULL)
! zImage_name = argp;
! else if (root_dev_name == NULL)
! root_dev_name = argp;
! else {
! usage();
! }
! }
! else {
! switch(*++argp) {
! case 'n':
! is_netBoot = 1;
! break;
! default:
! usage();
! break;
! }
! }
! }
! if ((is_netBoot) && ((unc_image_name == NULL) || (ram_name == NULL)))
! usage();
! if ((bootsect_name == NULL) || (setup_name == NULL) ||
! (zImage_name == NULL))
! usage();
!
! if (root_dev_name) {
! if (!strcmp(root_dev_name, "CURRENT")) {
if (stat("/", &sb)) {
perror("/");
***************
*** 102,108 ****
major_root = major(sb.st_dev);
minor_root = minor(sb.st_dev);
! } else if (strcmp(argv[4], "FLOPPY")) {
! if (stat(argv[4], &sb)) {
! perror(argv[4]);
die("Couldn't stat root device.");
}
--- 235,241 ----
major_root = major(sb.st_dev);
minor_root = minor(sb.st_dev);
! } else if (strcmp(root_dev_name, "FLOPPY")) {
! if (stat(root_dev_name, &sb)) {
! perror(root_dev_name);
die("Couldn't stat root device.");
}
***************
*** 114,123 ****
}
} else {
! major_root = DEFAULT_MAJOR_ROOT;
! minor_root = DEFAULT_MINOR_ROOT;
}
fprintf(stderr, "Root device is (%d, %d)\n", major_root, minor_root);
for (i=0;i<sizeof buf; i++) buf[i]=0;
! if ((id=open(argv[1],O_RDONLY,0))<0)
die("Unable to open 'boot'");
if (read(id,buf,MINIX_HEADER) != MINIX_HEADER)
--- 247,262 ----
}
} else {
! if (is_netBoot) {
! major_root = MAJOR_RAMDISK;
! minor_root = MINOR_RAMDISK;
! }
! else {
! major_root = DEFAULT_MAJOR_ROOT;
! minor_root = DEFAULT_MINOR_ROOT;
! }
}
fprintf(stderr, "Root device is (%d, %d)\n", major_root, minor_root);
for (i=0;i<sizeof buf; i++) buf[i]=0;
! if ((id=open(bootsect_name,O_RDONLY,0))<0)
die("Unable to open 'boot'");
if (read(id,buf,MINIX_HEADER) != MINIX_HEADER)
***************
*** 135,147 ****
if (((long *) buf)[7] != 0)
die("Illegal symbol table in 'boot'");
! i=read(id,buf,sizeof buf);
fprintf(stderr,"Boot sector %d bytes.\n",i);
if (i != 512)
die("Boot block must be exactly 512 bytes");
! if ((*(unsigned short *)(buf+510)) != (unsigned short)intel_short(0xAA55))
die("Boot block hasn't got boot flag (0xAA55)");
! buf[508] = (char) minor_root;
! buf[509] = (char) major_root;
! i=write(1,buf,512);
if (i!=512)
die("Write call failed");
--- 274,288 ----
if (((long *) buf)[7] != 0)
die("Illegal symbol table in 'boot'");
! i=read(id,&lh,sizeof buf);
fprintf(stderr,"Boot sector %d bytes.\n",i);
if (i != 512)
die("Boot block must be exactly 512 bytes");
! if (lh.boot_flag != (unsigned short)intel_short(0xAA55))
die("Boot block hasn't got boot flag (0xAA55)");
! if (lh.magic == (unsigned long)intel_long(0x1b031336))
! die("bottsect is already a net image\n");
! lh.root_dev_minor = (char) minor_root;
! lh.root_dev_major = (char) major_root;
! i=write(1,&lh,512);
if (i!=512)
die("Write call failed");
***************
*** 148,152 ****
close (id);
! if ((id=open(argv[2],O_RDONLY,0))<0)
die("Unable to open 'setup'");
if (read(id,buf,MINIX_HEADER) != MINIX_HEADER)
--- 289,293 ----
close (id);
! if ((id=open(setup_name,O_RDONLY,0))<0)
die("Unable to open 'setup'");
if (read(id,buf,MINIX_HEADER) != MINIX_HEADER)
***************
*** 185,189 ****
}
! if ((id=open(argv[3],O_RDONLY,0))<0)
die("Unable to open 'system'");
if (read(id,buf,GCC_HEADER) != GCC_HEADER)
--- 326,330 ----
}
! if ((id=open(zImage_name,O_RDONLY,0))<0)
die("Unable to open 'system'");
if (read(id,buf,GCC_HEADER) != GCC_HEADER)
***************
*** 200,203 ****
--- 341,345 ----
if (sys_size > SYS_SIZE)
die("System is too big");
+ total_length = sz;
while (sz > 0) {
int l, n;
***************
*** 208,212 ****
if ((n=read(id, buf, l)) != l) {
if (n == -1)
! perror(argv[1]);
else
fprintf(stderr, "Unexpected EOF\n");
--- 350,354 ----
if ((n=read(id, buf, l)) != l) {
if (n == -1)
! perror(zImage_name);
else
fprintf(stderr, "Unexpected EOF\n");
***************
*** 217,225 ****
}
close(id);
! if (lseek(1,500,0) == 500) {
! buf[0] = (sys_size & 0xff);
! buf[1] = ((sys_size >> 8) & 0xff);
! write(1, buf, 2);
}
return(0);
}
--- 359,422 ----
}
close(id);
! lh.syssize = intel_short(sys_size);
! if (is_netBoot) {
! if ((id = open(unc_image_name,O_RDONLY,0))<0)
! die("Unable to open 'uncompressed system'");
! if (read(id,buf,GCC_HEADER) != GCC_HEADER)
! die("Unable to read header of 'uncompressed system'");
! if (N_MAGIC(*ex) != ZMAGIC)
! die("Non-GCC header of 'uncompressed system'");
! fprintf(stderr,"Real System is %d kB (%d kB code, %d kB data and %d kB bss)\n",
! (ex->a_text+ex->a_data+ex->a_bss)/1024,
! ex->a_text /1024,
! ex->a_data /1024,
! ex->a_bss /1024);
! fluffed_length = ex->a_text+ex->a_data+ex->a_bss;
! close(id);
! if ((id=open(ram_name, O_RDONLY, 0))<0)
! die("Unable to open 'ramdisk'");
! iramsize = 0;
! while((i = read(id, buf, sizeof(buf))) > 0) {
! if (write(1, buf, i) != i)
! die("failed to write ramdisk");
! iramsize += i;
! }
! close(id);
! ramsize = (iramsize + 1023) / 1024;
! ramstart = 1024 + (fluffed_length + 4095) / 1024;
!
! if (ramsize) {
! lh.ram_size = (unsigned short) (ramsize);
! lh.ramdsk_start = (unsigned short) (ramstart);
! }
! lh.magic = intel_long(0x1b031336);
! lh.hlengthflags = intel_long(LENGTH_FIELD);
! lh.locn = intel_long(INITSEG<<16); /* es:bx */
! lh.execute = intel_long(SETUPSEG<<16); /* cs:ip */
! lh.lr_setup.rlength = intel_long(LENGTH_FIELD);
! lh.lr_setup.address = intel_long(SETUPSEG<<4);
! lh.lr_setup.ilength = intel_long(SETUP_SECTS * 512);
! lh.lr_setup.mlength = intel_long(SETUP_SECTS * 512);
! lh.lr_kernel.rlength = intel_long(LENGTH_FIELD | (ramsize ? 0 : FLAG_EOF));
! lh.lr_kernel.address = intel_long(SYSSEG<<4);
! lh.lr_kernel.ilength = intel_long(total_length);
! lh.lr_kernel.mlength = intel_long(total_length);
! if (ramsize) {
! lh.lr_ramdisk.rlength = intel_long(LENGTH_FIELD | FLAG_EOF);
! lh.lr_ramdisk.address = intel_long(ramstart * 1024);
! lh.lr_ramdisk.ilength = intel_long(iramsize);
! lh.lr_ramdisk.mlength = intel_long(ramsize * 1024);
! }
}
+ if (lseek(1,0,0) != 0)
+ die("Can't seek to beginning of redirected output");
+ i=write(1,&lh,512);
+ if (i!=512)
+ die("Rewrite boot sector failed");
return(0);
}
+
+
+
+
+